www.gusucode.com > VC 实现ListBox设置隔行不同颜色-源码程序 > VC 实现ListBox设置隔行不同颜色-源码程序/code/Win32Dlg.cpp

    // Win32Dlg.cpp : Defines the entry point for the application.
// Download by http://www.NewXing.com

//Windows界面编程第八篇 listbox彩色显示隔行变色
//http://blog.csdn.net/morewindows/article/details/8656061
//By MoreWindows-(http://blog.csdn.net/MoreWindows) 
#include "stdafx.h"
#include "resource.h"

BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
//使窗口居中
void CenterWindow(HWND hwnd);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
	return 0;
}

const int MAX_NUMBER = 8;
const int MAX_STRING_LEN = 50;
const char STR_TEXT[MAX_NUMBER][MAX_STRING_LEN] = {
	"MoreWindows", 
	"Master",
	"blog.csdn.net/MoreWindows", 
	"weibo.com/MoreWindows",
	"Windows界面编程",
	"秒杀多线程面试题系列",
	"Windows界面编程第八篇",
	"listbox彩色显示隔行变色"
};

BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND s_hLBColorListBox;
	switch (message)
	{
	case WM_INITDIALOG:
		{
			CenterWindow(hDlg);
			s_hLBColorListBox = GetDlgItem(hDlg, IDC_LB_COLORLISTBOX);
			//添加数据
			for (int i = 0; i < MAX_NUMBER; i++)
				SendMessage(s_hLBColorListBox, LB_ADDSTRING, 0, (LPARAM)STR_TEXT[i]);
		}
		return FALSE;
		
		
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hDlg, FALSE);
			return TRUE;

		case IDC_LB_COLORLISTBOX:  //listbox control ID
			switch (HIWORD(wParam))
			{
			case LBN_DBLCLK:   //双击事件
				{	
					char szBuffer[MAX_STRING_LEN];
					int nCurSel = SendMessage(s_hLBColorListBox, LB_GETCURSEL, 0, 0);
					SendMessage(s_hLBColorListBox, LB_GETTEXT, (WPARAM)nCurSel, (LPARAM)szBuffer);
					MessageBox(NULL, szBuffer, "listbox item", MB_OK);
				}
				return TRUE;
			}
			break;
		}
		break;


	case WM_DRAWITEM:
		{
			LPDRAWITEMSTRUCT lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
			if (lpDrawItem->CtlType == ODT_LISTBOX || lpDrawItem->CtlID == IDC_LB_COLORLISTBOX)
			{
				if (lpDrawItem->itemID == -1)
					break;
				
				char szItemString[MAX_STRING_LEN];
				int nItemStringLen;
				SendMessage(s_hLBColorListBox, LB_GETTEXT, (WPARAM)lpDrawItem->itemID, (LPARAM)szItemString);
				nItemStringLen = strlen(szItemString);

				// 设置选中一行时,这一行加边框,反色
				if ((lpDrawItem->itemState & ODS_SELECTED) &&   
					(lpDrawItem->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
				{
					DrawFocusRect(lpDrawItem->hDC, &lpDrawItem->rcItem); 
					InvertRect(lpDrawItem->hDC, &lpDrawItem->rcItem);
				}
				else if (!(lpDrawItem->itemState & ODS_SELECTED) && 
					(lpDrawItem->itemAction & ODA_SELECT))
				{
					DrawFocusRect(lpDrawItem->hDC, &lpDrawItem->rcItem);
					InvertRect(lpDrawItem->hDC, &lpDrawItem->rcItem);
				}
				
				// 隔行变色
				if (lpDrawItem->itemID % 2 == 0)
					SetTextColor(lpDrawItem->hDC, RGB(25, 125, 0));
				else
					SetTextColor(lpDrawItem->hDC, RGB(0, 25, 125));
				
				// 文字背景色
				if (lpDrawItem->itemState & ODS_SELECTED)
				{
					SetBkMode(lpDrawItem->hDC, TRANSPARENT);
					SetTextColor(lpDrawItem->hDC, RGB(255, 255, 255));
				}
				else 
				{
					SetBkMode(lpDrawItem->hDC, OPAQUE);
					SetBkColor(lpDrawItem->hDC, GetSysColor(COLOR_WINDOW));
				}
				
				//输出文字
				DrawText(lpDrawItem->hDC, szItemString, nItemStringLen, &lpDrawItem->rcItem, DT_LEFT | DT_SINGLELINE);
				return TRUE;
			}	
		}
		break;
	}
	return FALSE;
}

void CenterWindow(HWND hwnd)
{
	RECT   rcDlg;
	int    nDlgWidth, nDlgHight;
	int    nScreenWidth, nScreenHight;
	
	nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	nScreenHight = GetSystemMetrics(SM_CYSCREEN);
	
	GetWindowRect(hwnd, &rcDlg);
	nDlgWidth = rcDlg.right - rcDlg.left;
	nDlgHight = rcDlg.bottom - rcDlg.top;
	
	MoveWindow(hwnd, (nScreenWidth  - nDlgWidth) / 2, (nScreenHight - nDlgHight) / 2, nDlgWidth, nDlgHight, FALSE);
}




//1 选中红字背景无变化
//上面没有InvertRect  下面SetBkMode(lpDrawItem->hDC, TRANSPARENT); SetTextColor();
//2 选中黑底,白字
//上面有InvertRect  下面SetBkMode(lpDrawItem->hDC, TRANSPARENT); SetTextColor();